home *** CD-ROM | disk | FTP | other *** search
- /**
- * Scout - The Amiga System Monitor
- *
- *------------------------------------------------------------------
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * You must not use this source code to gain profit of any kind!
- *
- *------------------------------------------------------------------
- *
- * @author Andreas Gelhausen
- * @author Richard Körber <rkoerber@gmx.de>
- */
-
- #include "system_headers.h"
-
- struct ClassesCallbackUserData {
- APTR ud_Tree;
- ULONG ud_Count;
- };
-
- static __asm __saveds LONG classtree_confunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_ConstructMessage *msg, register __a0 struct Hook *hook)
- {
- return AllocListEntry(msg->MemPool, msg->UserData, sizeof(struct ClassEntry));
- }
-
- MakeHook(classtree_conhook, classtree_confunc);
-
- static __asm __saveds LONG classtree_desfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_ConstructMessage *msg, register __a0 struct Hook *hook)
- {
- FreeListEntry(msg->MemPool, &msg->UserData);
-
- return 0;
- }
-
- MakeHook(classtree_deshook, classtree_desfunc);
-
- static __asm __saveds LONG classtree_dspfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_DisplayMessage *msg, register __a0 struct Hook *hook)
- {
- if (msg->TreeNode != NULL) {
- struct ClassEntry *ce = msg->TreeNode->tn_User;
-
- msg->Array[0] = ce->ce_Address;
- msg->Array[1] = ce->ce_ClassName;
- msg->Array[2] = ce->ce_ObjectCount;
- msg->Array[3] = ce->ce_SubClassCount;
- msg->Array[4] = ce->ce_Dispatcher;
- } else {
- msg->Array[0] = "Address";
- msg->Array[1] = "cl_ID";
- msg->Array[2] = "Objects";
- msg->Array[3] = "Subclasses";
- msg->Array[4] = "cl_Dispatcher";
- msg->Preparse[0] = MUIX_B;
- msg->Preparse[1] = MUIX_B;
- msg->Preparse[2] = MUIX_B;
- msg->Preparse[3] = MUIX_B;
- msg->Preparse[4] = MUIX_B;
- }
-
- return 0;
- }
-
- MakeHook(classtree_dsphook, classtree_dspfunc);
-
- static __asm __saveds LONG classtree_cmpfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_CompareMessage *msg, register __a0 struct Hook *hook)
- {
- struct ClassEntry *ce1, *ce2;
- LONG cmp;
-
- ce1 = (struct ClassEntry *)msg->TreeNode1->tn_User;
- ce2 = (struct ClassEntry *)msg->TreeNode2->tn_User;
-
- cmp = stricmp(ce1->ce_SuperClassName, ce2->ce_SuperClassName);
- if (cmp == 0) cmp = stricmp(ce1->ce_ClassName, ce2->ce_ClassName);
-
- return cmp;
- }
-
- MakeHook(classtree_cmphook, classtree_cmpfunc);
-
- static __asm __saveds LONG classtree_findfunc(register __a2 Object *obj, register __a1 struct MUIP_NListtree_FindUserDataMessage *msg, register __a0 struct Hook *hook)
- {
- struct ClassEntry *ce;
-
- ce = (struct ClassEntry *)msg->UserData;
-
- if (ce) {
- return stricmp((UBYTE *)msg->User, ce->ce_Address);
- } else {
- return ~0;
- }
- }
-
- MakeHook(classtree_findhook, classtree_findfunc);
-
- static void ReceiveList( void (* callback)( struct ClassEntry *ce, void *userData ),
- void *userData )
- {
- if (SendDaemon("GetClassList")) {
- struct ClassEntry ce;
-
- while (ReceiveDecodedEntry((UBYTE *)&ce, sizeof(struct ClassEntry))) {
- callback(&ce, userData);
- }
- }
- }
-
- static void IterateList( void (* callback)( struct ClassEntry *ce, void *userData ),
- void *userData )
- {
- struct IClass *myclass;
-
- if (myclass = MakeClass("« Scout Dummy Class »", "rootclass", NULL, 0, 0)) {
- struct List *clist;
- struct IClass *cl;
- struct MinList tmplist;
- struct ClassEntry *ce, *_ce;
-
- NewList((struct List *)&tmplist);
-
- AddClass(myclass);
-
- Forbid();
-
- clist = FindListOfNode((struct Node *)&myclass->cl_Dispatcher.h_MinNode);
- ITERATE_LIST_REVERSE(clist, struct IClass *, cl) {
- // iterate the list in reverse order, because we need rootclass to be inserted as the very first element
- if (cl != myclass) {
- if (ce = AllocVec(sizeof(struct ClassEntry), MEMF_PUBLIC)) {
- struct Hook *disp;
- APTR dispentry;
-
- disp = &cl->cl_Dispatcher;
-
- ce->ce_Addr = cl;
- _snprintf(ce->ce_Address, sizeof(ce->ce_Address), "$%08lx", cl);
- if (cl->cl_Super) {
- stccpy(ce->ce_SuperClassName, cl->cl_Super->cl_ID, sizeof(ce->ce_SuperClassName));
- } else {
- stccpy(ce->ce_SuperClassName, nonetest(NULL), sizeof(ce->ce_SuperClassName));
- }
- _snprintf(ce->ce_SuperClassAddress, sizeof(ce->ce_SuperClassAddress), "$%08lx", cl->cl_Super);
-
- dispentry = (disp->h_SubEntry) ? (APTR)disp->h_SubEntry : (APTR)disp->h_Entry;
- if (points2ram(dispentry)) {
- _snprintf(ce->ce_Dispatcher, sizeof(ce->ce_Dispatcher), MUIX_PH "$%08lx" MUIX_PT, dispentry);
- } else {
- _snprintf(ce->ce_Dispatcher, sizeof(ce->ce_Dispatcher), "$%08lx", dispentry);
- }
-
- stccpy(ce->ce_ClassName, cl->cl_ID, sizeof(ce->ce_ClassName));
- _snprintf(ce->ce_ObjectCount, sizeof(ce->ce_ObjectCount), "%6lD", cl->cl_ObjectCount);
- _snprintf(ce->ce_SubClassCount, sizeof(ce->ce_SubClassCount), "%6lD", cl->cl_SubclassCount);
-
- AddTail((struct List *)&tmplist, (struct Node *)ce);
- }
- }
- }
-
- Permit();
-
- ITERATE_CHANGING_LIST(&tmplist, struct ClassEntry *, ce, _ce) {
- callback(ce, userData);
- FreeVec(ce);
- }
-
- FreeClass(myclass);
- }
- }
-
- static void UpdateCallback( struct ClassEntry *ce,
- void *userData )
- {
- struct ClassesCallbackUserData *ud = (struct ClassesCallbackUserData *)userData;
- struct MUI_NListtree_TreeNode *parent;
- ULONG flags;
- LONG subclasses;
-
- IsDec(ce->ce_SubClassCount, &subclasses);
-
- flags = 0;
- if (subclasses > 0) flags = TNF_LIST | TNF_OPEN;
-
- parent = (struct MUI_NListtree_TreeNode *)DoMethod(ud->ud_Tree, MUIM_NListtree_FindUserData, MUIV_NListtree_FindUserData_ListNode_Root, ce->ce_SuperClassAddress, MUIV_NListtree_FindUserData_Flag_StartNode);
- DoMethod(ud->ud_Tree, MUIM_NListtree_Insert, ce->ce_ClassName, ce, parent, MUIV_NListtree_Insert_PrevNode_Sorted, flags);
- ud->ud_Count++;
- }
-
- static void PrintCallback( struct ClassEntry *ce,
- void *userData )
- {
- if (strncmp(ce->ce_Dispatcher, MUIX_PH, strlen(MUIX_PH)) == 0) {
- PrintFOneLine((BPTR)userData, " %s %7s %11s %-20s %-9.9s %-20s\n", ce->ce_Address, ce->ce_ObjectCount, ce->ce_SubClassCount, ce->ce_SuperClassName, ce->ce_Dispatcher + 2, ce->ce_ClassName);
- } else {
- PrintFOneLine((BPTR)userData, " %s %7s %11s %-20s %-9.9s %-20s\n", ce->ce_Address, ce->ce_ObjectCount, ce->ce_SubClassCount, ce->ce_SuperClassName, ce->ce_Dispatcher, ce->ce_ClassName);
- }
- }
-
- static void SendCallback( struct ClassEntry *ce,
- void *userData )
- {
- SendEncodedEntry((UBYTE *)ce, sizeof(struct ClassEntry));
- }
-
- static ULONG __saveds mNew( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- APTR classlist, classtree, classtext, classcount, updateButton, printButton, removeButton, moreButton, exitButton;
-
- if (obj = (Object *)DoSuperNew(cl, obj,
- MUIA_HelpNode, ClassesText,
- MUIA_Window_ID, MakeID('C','L','A','S'),
- WindowContents, VGroup,
-
- Child, classlist = MyNListtreeObject(&classtree, "BAR,BAR,BAR P=" MUIX_R ",BAR P=" MUIX_R ",BAR", &classtree_conhook, &classtree_deshook, &classtree_dsphook, &classtree_cmphook, &classtree_findhook, 1),
- Child, MyBelowListview(&classtext, &classcount),
-
- Child, MyVSpace(4),
-
- Child, HGroup, MUIA_Group_SameSize, TRUE,
- Child, updateButton = MakeButton(txtUpdate),
- Child, printButton = MakeButton(txtPrint),
- Child, removeButton = MakeButton(txtRemove),
- Child, moreButton = MakeButton(txtMore),
- Child, exitButton = MakeButton(txtExit),
- End,
- End,
- TAG_MORE, msg->ops_AttrList))
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
- APTR parent;
-
- cwd->cwd_ClassTree = classtree;
- cwd->cwd_ClassText = classtext;
- cwd->cwd_ClassCount = classcount;
- cwd->cwd_RemoveButton = removeButton;
- cwd->cwd_MoreButton = moreButton;
-
- parent = (APTR)GetTagData(MUIA_Window_ParentWindow, (ULONG)NULL, msg->ops_AttrList);
-
- set(obj, MUIA_Window_Title, MyGetWindowTitle("CLASSES", cwd->cwd_Title, sizeof(cwd->cwd_Title)));
- set(obj, MUIA_Window_ActiveObject, classlist);
- set(removeButton, MUIA_Disabled, TRUE);
- set(moreButton, MUIA_Disabled, TRUE);
-
- DoMethod(parent, MUIM_Window_AddChildWindow, obj);
- DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 5, MUIM_Application_PushMethod, parent, 2, MUIM_Window_RemChildWindow, obj);
- DoMethod(classtree, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime, obj, 1, MUIM_ClassesWin_ListChange);
- DoMethod(classtree, MUIM_Notify, MUIA_NListtree_DoubleClick, MUIV_EveryTime, obj, 1, MUIM_ClassesWin_More);
- DoMethod(updateButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_ClassesWin_Update);
- DoMethod(printButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_ClassesWin_Print);
- DoMethod(removeButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_ClassesWin_Remove);
- DoMethod(moreButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_ClassesWin_More);
- DoMethod(exitButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);
- }
-
- return (ULONG)obj;
- }
-
- static ULONG __saveds mDispose( struct IClass *cl,
- Object *obj,
- struct opSet *msg )
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
-
- set(obj, MUIA_Window_Open, FALSE);
- DoMethod(cwd->cwd_ClassTree, MUIM_NListtree_Clear, NULL, 0);
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
- static ULONG __saveds mUpdate( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
- struct ClassesCallbackUserData ud;
-
- ApplicationSleep(TRUE);
- set(cwd->cwd_ClassTree, MUIA_NListtree_Quiet, TRUE);
- DoMethod(cwd->cwd_ClassTree, MUIM_NListtree_Clear, NULL, 0);
-
- ud.ud_Tree = cwd->cwd_ClassTree;
- ud.ud_Count = 0;
-
- if (clientstate) {
- ReceiveList(UpdateCallback, &ud);
- } else {
- IterateList(UpdateCallback, &ud);
- }
-
- SetCountText(cwd->cwd_ClassCount, ud.ud_Count);
- MySetContents(cwd->cwd_ClassText, "");
-
- set(cwd->cwd_ClassTree, MUIA_NListtree_Quiet, FALSE);
- set(cwd->cwd_ClassTree, MUIA_NListtree_Active, MUIV_NListtree_Active_Off);
- set(cwd->cwd_RemoveButton, MUIA_Disabled, TRUE);
- set(cwd->cwd_MoreButton, MUIA_Disabled, TRUE);
- ApplicationSleep(FALSE);
-
- return 0;
- }
-
- static ULONG __saveds mPrint( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- PrintClass(NULL);
-
- return 0;
- }
-
- static ULONG __saveds mRemove( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
- struct MUI_NListtree_TreeNode *tn;
-
- if (tn = GetActiveTreeNode(cwd->cwd_ClassTree)) {
- struct ClassEntry *ce = (struct ClassEntry *)tn->tn_User;
-
- if (MyRequest(msgYesNo, msgWantToRemoveClass, ce->ce_ClassName)) {
- MyDoCommand("RemoveClass %s", ce->ce_Address);
- DoMethod(obj, MUIM_ClassesWin_Update);
- }
- }
-
- return 0;
- }
-
- static ULONG __saveds mMore( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
- struct MUI_NListtree_TreeNode *tn;
-
- if (tn = GetActiveTreeNode(cwd->cwd_ClassTree)) {
- struct ClassEntry *ce = (struct ClassEntry *)tn->tn_User;
- APTR detailWin;
-
- if (detailWin = ClassesDetailWindowObject,
- MUIA_Window_ParentWindow, obj,
- End) {
- set(detailWin, MUIA_ClassesDetailWin_Class, ce);
- set(detailWin, MUIA_Window_Open, TRUE);
- }
- }
-
- return 0;
- }
-
- static ULONG __saveds mListChange( struct IClass *cl,
- Object *obj,
- Msg msg )
- {
- struct ClassesWinData *cwd = INST_DATA(cl, obj);
- struct MUI_NListtree_TreeNode *tn;
-
- if (tn = GetActiveTreeNode(cwd->cwd_ClassTree)) {
- struct ClassEntry *ce = (struct ClassEntry *)tn->tn_User;
-
- MySetContents(cwd->cwd_ClassText, "%s \"%s\"", ce->ce_Address, ce->ce_ClassName);
- set(cwd->cwd_RemoveButton, MUIA_Disabled, FALSE);
- if (!clientstate) set(cwd->cwd_MoreButton, MUIA_Disabled, FALSE);
- }
-
- return 0;
- }
-
- ULONG __asm __saveds ClassesWinDispatcher( register __a0 struct IClass *cl,
- register __a2 Object *obj,
- register __a1 Msg msg )
- {
- switch (msg->MethodID) {
- case OM_NEW: return (mNew(cl, obj, (APTR)msg));
- case OM_DISPOSE: return (mDispose(cl, obj, (APTR)msg));
- case MUIM_ClassesWin_Update: return (mUpdate(cl, obj, (APTR)msg));
- case MUIM_ClassesWin_Print: return (mPrint(cl, obj, (APTR)msg));
- case MUIM_ClassesWin_Remove: return (mRemove(cl, obj, (APTR)msg));
- case MUIM_ClassesWin_More: return (mMore(cl, obj, (APTR)msg));
- case MUIM_ClassesWin_ListChange: return (mListChange(cl, obj, (APTR)msg));
- }
-
- return (DoSuperMethodA(cl, obj, msg));
- }
-
- void PrintClass( char *filename )
- {
- BPTR handle;
-
- if (handle = HandlePrintStart(filename)) {
- PrintFOneLine(handle, "\n Address Objects Subclasses Superclass Dispatcher Name\n\n");
- IterateList(PrintCallback, (void *)handle);
- }
-
- HandlePrintStop();
- }
-
- void SendClassList( void )
- {
- IterateList(SendCallback, NULL);
- }
-
-